{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### **Title**: HexTiles Element\n",
    "\n",
    "**Dependencies** Bokeh\n",
    "\n",
    "**Backends** [Bokeh](./HexTiles.ipynb), [Matplotlib](../matplotlib/HexTiles.ipynb)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import holoviews as hv\n",
    "from holoviews import opts\n",
    "from holoviews import dim\n",
    "hv.extension('bokeh')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "``HexTiles`` provide a representation of the data as a bivariate histogram useful for visualizing the structure in larger datasets. The ``HexTiles`` are computed by tesselating the x-, y-ranges of the data, storing the number of points falling in each hexagonal bin. By default ``HexTiles`` simply counts the data in each bin but it also supports weighted aggregations. Currently only linearly spaced bins are supported when using the bokeh backend.\n",
    "\n",
    "As a simple example we will generate 100,000 normally distributed points and plot them using ``HexTiles``:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.seed(44)\n",
    "hex_tiles = hv.HexTiles(np.random.randn(100000, 2))\n",
    "hex_tiles.opts(opts.HexTiles(width=500, height=400, tools=['hover'], colorbar=True))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Note that the hover shows a ``Count`` by default, representing the number of points falling within each bin.\n",
    "\n",
    "It is also possible to provide additional value dimensions and define an ``aggregator`` to aggregate by value. If multiple value dimensions are defined the dimension to be colormapped may be defined using the ``color`` option. Note however that multiple value dimensions are allowed and will be displayed in the hover tooltip."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "xs, ys = np.random.randn(2, 1000)\n",
    "hex_with_values = hv.HexTiles((xs, ys, xs*(ys/2.), (xs**2)*ys), vdims=['Values', 'Hover Values'])\n",
    "overlay = hex_with_values * hv.Points(hex_with_values)\n",
    "\n",
    "overlay.opts(\n",
    "    opts.HexTiles(width=400, height=400, aggregator=np.sum, tools=['hover']),\n",
    "    opts.Points(size=1, color='black'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The bokeh backend also supports scaling the size of each hexagon by a value, which can be enabled using the ``scale`` option. Since we do not want zero sized bins we will scale the normalized counts by 0.5 and then add a minimum size of 0.3.\n",
    "\n",
    "Here we will generate two separate distributions and visualize them by scaling each bin by the 'Count'."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "x, y = np.hstack([np.random.randn(2, 10000), np.random.randn(2, 10000)*0.8+2])\n",
    "hex_two_distributions = hv.HexTiles((x, y))\n",
    "hex_two_distributions.opts(scale=(dim('Count').norm()*0.5)+0.3, width=500, height=500)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "By default ``HexTiles`` do not plot bins that do not contain any data but using the ``min_count`` option it is possible to plot bins with zero values as well or alternatively set a higher cutoff. Using this options can result in a more visually appealing plot particularly when overlaid with other elements.\n",
    "\n",
    "Here we will plot the same distributions as above and overlay a ``Bivariate`` plot of the same data:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "overlay = hex_two_distributions * hv.Bivariate(hex_two_distributions)\n",
    "\n",
    "overlay.opts(\n",
    "    opts.HexTiles(min_count=0, width=500, height=500, tools=['hover']),\n",
    "    opts.Bivariate(show_legend=False, line_width=3))"
   ]
  }
 ],
 "metadata": {
  "language_info": {
   "name": "python",
   "pygments_lexer": "ipython3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
